﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebRamosUC.Models;

namespace WebRamosUC.Controllers
{
    public class SearchController : Controller
    {
        //
        // GET: /Search/

        public ActionResult Index()
        {
            RepositorioPeriodo repoPeriodo = new RepositorioPeriodo();
            RepositorioFacultad repoFacultad = new RepositorioFacultad();

            //Pasamos la info de periodos/Campus para los drop-down list de la busqueda.
            ViewData["Periodos"] = new SelectList(repoPeriodo.GetAllPeriodos(), repoPeriodo.GetPeriodoActual());
            ViewData["Campus"] = new SelectList(new string[] {"TODOS","CC","CO","LC","SJ","VILLARICA"}, "TODOS");

            List<string> facultades = new List<string>(new string[] { "TODAS" });
            foreach (var fac in repoFacultad.AllFacultades())
                facultades.Add(fac.ToString());
            ViewData["Facultades"] = new SelectList(facultades, "TODAS");

            //Mostramos el formulario de busqueda.
            return View();
        }

        /// <summary>
        /// Realizamos la busqueda (HTTPPost).
        /// </summary>
        [HttpPost]
        public ActionResult Index(FormCollection searchQuery)
        {

            //Llamamos al helper para filtrar cursos
            switch(searchQuery["tipoBusqueda"])
            {
                case "cursos":
                    return SearchCursosHelper(searchQuery);
                case "docentes":
                    return SearchDocentesHelper(searchQuery);
                default:
                    return SearchCursosHelper(searchQuery);
            }
        }

        /// <summary>
        /// Realiza busqueda de DOCENTES (profes).
        /// TODO: Buscar ayudantes?
        /// </summary>
        /// <param name="searchQuery">
        /// El query debe contener al menos uno de los sgtes keys:
        /// keywords</param>
        private ViewResult SearchDocentesHelper(FormCollection searchQuery)
        {
            //Solucion parche: No se puede buscar mas de 50 docentes.
            int? page = 0;
            int pageSize = 50;

            RepositorioProfesor repoProfe = new RepositorioProfesor();
            IQueryable<Profesor> profesResult;

            if (!String.IsNullOrWhiteSpace(searchQuery["keywords"]))
            {
                profesResult = repoProfe.GetProfesoresNombreSinOrden(searchQuery["keywords"]);
            }
            else
                profesResult = null;  //Lista vacia

            //Terminamos de filtrar! Solo mostramos los resultados si se encontraron profes.
            if (profesResult != null && profesResult.Any())
            {
                var paginatedProfes = new PaginatedList<Profesor>(profesResult, page ?? 0, pageSize);
                return View("ResultsDocente", paginatedProfes);
            }
            else
            {
                return View("NotFound");
            }
        }

        /// <summary>
        /// Realiza la busqueda de cursos.
        /// </summary>
        /// <param name="searchQuery">
        /// El query debe contener al menos uno de los sgtes keys:
        /// keywords, periodo, sigla, facultad, profesor, descripcion, campus. </param>
        private ViewResult SearchCursosHelper(FormCollection searchQuery)
        {
            //TODO: "page" debe ser un parametro... PROBLEMA porque este metodo es solo HttpPOST!
            //Solucion parche: No se puede buscar mas de 50 cursos.
            int? page = 0;
            int pageSize = 50;

            RepositorioCurso repoCurso = new RepositorioCurso();
            IQueryable<Curso> cursosResult;

            //Filtramos por CURSO/SIGLA:
            if (!String.IsNullOrWhiteSpace(searchQuery["keywords"]))
            {
                ViewData["keywords"] = searchQuery["keywords"];
                cursosResult = repoCurso.GetCursos(searchQuery["keywords"], false);
            }
            else
                cursosResult = repoCurso.AllCursos();

            //Filtramos por PERIODO: (No implementado!)
            if (!String.IsNullOrWhiteSpace(searchQuery["periodo"]))
            {
                RepositorioPeriodo repoPeriodo = new RepositorioPeriodo();
                string periodoStr = searchQuery["periodo"];
                Periodo periodo = repoPeriodo.GetPeriodo(periodoStr.Split('-')[0], periodoStr.Split('-')[1]);

                //TODO: Como filtro por periodo? Estoy buscando CURSOS (atemporal), no SECCIONES.
                //cursos.Where(c => c.Periodo == periodo);
            }

            //Filtramos por SIGLA:
            if (!String.IsNullOrWhiteSpace(searchQuery["sigla"]))
            {
                cursosResult = cursosResult.Where(c => c.Sigla.StartsWith(searchQuery["sigla"]));
            }

            //Filtramos por FACULTAD:
            if (!String.IsNullOrWhiteSpace(searchQuery["facultad"]) && searchQuery["facultad"] != "TODAS")
            {
                cursosResult = cursosResult.Where(c => c.Facultad.Nombre == searchQuery["facultad"]);
            }

            //Filtramos por PROFESOR:
            if (!String.IsNullOrWhiteSpace(searchQuery["profesor"]))
            {
                RepositorioProfesor repoProfe = new RepositorioProfesor();
                Profesor profe = repoProfe.GetProfesor(searchQuery["profesor"]);
                if (profe != null)
                {
                    cursosResult = cursosResult.Where(c => c.Secciones.Any(sec => sec.ProfesorSecciones.Any(ps => ps.Profesor == profe)));
                }
                else
                {
                    ViewData["Errors"] = "No se encontró el profesor buscado. A continuación se muestran el resto de los resultados.";
                }
            }

            //Filtramos por DESCRIPCION:
            if (!String.IsNullOrWhiteSpace(searchQuery["descripcion"]))
            {
                cursosResult = cursosResult.Where(c => c.Descripcion.Contains(searchQuery["descripcion"]));
            }

            //Filtramos por CAMPUS:
            if (!String.IsNullOrWhiteSpace(searchQuery["campus"]) && searchQuery["campus"] != "TODOS")
            {
                cursosResult = cursosResult.Where(c => c.Secciones.Any(sec => sec.Horario.Modulos.Any(mod => mod.Sala.Campus == searchQuery["campus"])));
            }

            //Terminamos de filtrar! Solo mostramos los resultados si se encontraron cursos.
            if (cursosResult.Any())
            {
                ViewData["keywords"] = searchQuery["keywords"];
                var paginatedCursos = new PaginatedList<Curso>(cursosResult, page ?? 0, pageSize);
                return View("Results", paginatedCursos);
            }
            else
            {
                return View("NotFound");
            }
        }


        //Este metodo no se usa, pero es la idea para solucionar lo de pablo, que el otro metodo llame a este
        //Si es que saben como llamar a este metodo desde la vista, para la variable cursos, usen el Source de PaginatedList
        //Ese Source tiene toda la lista entera
        public ActionResult Cursos(IQueryable<Curso> cursos, int? page)
        {
            int pageSize = 40;
            var paginatedCursos = new PaginatedList<Curso>(cursos, page ?? 0, pageSize);
            return View("Results", paginatedCursos);
        }


        public ActionResult Report(String id)
        {
            string body = "Se ha reportado el Keyword: "+id;
            Mail mail = new Mail();
            mail.enviarMail("tmeryu@gmail.com", "Tomás Mery", "[WebRamosUC] Reporte Búsqueda", body);
            return View();
        }

    }
}
